Problem s parametrem typu varArray

Otázka od: j.binder@albacon.cz

11. 8. 2004 13:20

Ahoj,
mam problem s volanim metody COM objektu pres ktery se nejak nemuzu prenest
(D7 Pro + Update).
Kdyby mi nekdo mohl poradit, byl bych moc vdecny.

Metoda je deklarovana

 function Sense(var ReceiveData: OleVariant): Integer; dispid 17;

Receive Data ma byt buffer delky 77 bytu

Predopokladal jsem, ze bude fungovat toto:

procedure GetState;
var
  Buf: OleVariant;
  i: integer;
begin
 Buf := VarArrayCreate([0..76], varByte);
 for i := 0 to 76 do Buf[i] := 0;
 Sense(Buf);
 ...
end;

Pri vystupu z procedury mi to hazi chybu
 Variant or safe array is locked

V dokumentaci je metoda deklarovana
LONG Sense(VARIANT* ReceiveData)

a priklad VB skriptu, kde je volana takto

dim ReceiveData(76)
dim Length
Length = 76 For i = 0 To Length ReceiveData(i) = 0 Next
Sense(ReceiveData(0))

Za kazde postrceni moc dekuji Jiri Binder


Odpovedá: Marek Spisak

12. 8. 2004 12:01

j.binder@albacon.cz wrote:

>mam problem s volanim metody COM objektu pres ktery se nejak nemuzu prenest
(D7 Pro + Update).
>Kdyby mi nekdo mohl poradit, byl bych moc vdecny.
>
>Metoda je deklarovana
>
> function Sense(var ReceiveData: OleVariant): Integer; dispid 17;
>
>Receive Data ma byt buffer delky 77 bytu
>
>Predopokladal jsem, ze bude fungovat toto:
>
>procedure GetState;
>var
> Buf: OleVariant;
> i: integer;
>begin
> Buf := VarArrayCreate([0..76], varByte);
> for i := 0 to 76 do Buf[i] := 0;
> Sense(Buf);
> ...
>end;
>
>Pri vystupu z procedury mi to hazi chybu
> Variant or safe array is locked
>
>

zkus to takhle

procedure GetState;
var
  Buf: OleVariant;
  i: integer;
  Data: PByteArray;
begin
  Buf:= VarArrayCreate([0, 76], varByte);
  Data:= VarArrayLock(Buf);
  try
    for i := 0 to 76 do Data^[i]:= 0;
  finally
    VarArrayUnlock(Buf);
  end;
  Sense(Buf);

  ...

end;

pisu to z hlavy, doufam, ze to pojede... neco podobneho pouzivam (D5 prof).

Marek


Odpovedá: j.binder@albacon.cz

12. 8. 2004 23:00


From: "Marek Spisak" <spishark@post.cz>
> zkus to takhle
>
> procedure GetState;
> var
> Buf: OleVariant;
> i: integer;
> Data: PByteArray;
> begin
> Buf:= VarArrayCreate([0, 76], varByte);
> Data:= VarArrayLock(Buf);
> try
> for i := 0 to 76 do Data^[i]:= 0;
> finally
> VarArrayUnlock(Buf);
> end;
> Sense(Buf);


Diky za odpoved. Zkousel jsem, trochu jsem s tim poexperimentoval. Bohuzel jsme
se nepohnul.
V ruznych variantach volani to hazi chyby dost nahodne, v kazdem pripade v Buf
nic rozumneho neprijde,
a vse konci (casto i padem aplikace) pri vystupu z procedury, tj, pri destrukci
variantu Buf.
Nabyl jsme presvedceni, ze metoda ocekava ne varArray, ale spis pointer na nej.
Neco takoveho v importu type library byt nemuze, tak jsem zacal zkouset
vytvareni objektu za chodu pomoci CreateOleObject. Tam jsem zatim moc neuspel,
protoze objekt vytvorim, k predpokladanym metodam se zna, ale jejich volani
skonci hlaskou katastroficke selhani". Kdyby mi nekdo mohl poradit byl bych dost vdecny.
           Zdravi Jiri Binder